#pragma once

#include "Atraccion.h"
#include "ComparadorCalificacionPorFecha.h"
#include "AVL.h"

Atraccion::Atraccion(Cadena identificador, Cadena nombre, nat horarioInicio, nat horarioFin, pCiudad ciudad, nat precio)
{
	this->identificador = identificador;
	this->nombre = nombre;
	this->horarioInicio = horarioInicio;
	this->horarioFin = horarioFin;
	this->ciudad = ciudad;
	this->precio = precio;
	
	this->calificaciones = new AVL<Tupla<nat, int, Cadena>>(new ComparadorCalificacionPorFecha());
	
}

Cadena Atraccion::ObtenerIdentificador() const
{
	return this->identificador;
}

Cadena Atraccion::ObtenerNombre() const
{
	return this->nombre;
}

nat Atraccion::ObtenerHorarioInicio() const
{
	return this->horarioInicio;
}

nat Atraccion::ObtenerHorarioFin() const
{
	return this->horarioFin;
}

pCiudad Atraccion::ObtenerCiudad() const
{
	return this->ciudad;
}

nat Atraccion::ObtenerPrecio() const
{
	return this->precio;
}

Iterador<Tupla<nat, int, Cadena>> Atraccion::ObtenerCalificaciones() const
{
	return calificaciones->ObtenerIterador();
}


void Atraccion::AgregarOActualizarCalificacion(Tupla<nat, int, Cadena> &cal)
{
	//Actualizar
	if(calificaciones->Existe(cal))
	{
		Tupla<nat, int, Cadena> tupla = calificaciones->Recuperar(cal);
		tupla.AsignarDato2(cal.ObtenerDato2());
		tupla.AsignarDato3(cal.ObtenerDato3());
		
	}
	else
	{
		//Calificacion nueva para la fecha...la inserto
		calificaciones->Insertar(cal);
	}
	
}

bool Atraccion::operator==(const IAtraccion& a) const
{
	return this == &a;
}
